#!/bin/bash

# 定义颜色变量
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m' # 无颜色

# 动态获取脚本所在目录的绝对路径
SCRIPT_PATH=$(readlink -f "$0")  # 获取脚本的绝对路径（含文件名）
SCRIPT_DIR=$(dirname "$SCRIPT_PATH")  # 提取脚本所在目录

# 动态拼接项目路径（假设 Net8.Project 与脚本在同一目录下）
PROJECT_PATH="$SCRIPT_DIR/Net8.Project"
PUBLISH_PATH="$PROJECT_PATH/bin/Debug/.PublishFiles"
DB_PATH="$PUBLISH_PATH/Dbfile"

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 错误处理函数
handle_error() {
    log_error "$1"
    exit 1
}

# 检查目录是否存在
check_directory() {
    if [ ! -d "$1" ]; then
        log_warn "目录不存在: $1"
        return 1
    fi
    return 0
}

# 清理发布目录
clean_publish() {
    log_info "清理发布目录..."
    if check_directory "$PUBLISH_PATH"; then
        log_info "删除旧发布目录..."
        rm -rf "$PUBLISH_PATH" || handle_error "无法删除旧发布目录"
    fi
}

# 构建项目
build_project() {
    log_info "正在构建项目..."
    dotnet build "$PROJECT_PATH" || handle_error "项目构建失败"
}

# 发布项目
publish_project() {
    log_info "正在发布项目..."
    dotnet publish "$PROJECT_PATH" -o "$PUBLISH_PATH" || handle_error "项目发布失败"
}

# 清理发布结果
clean_after_publish() {
    log_info "清理发布结果..."
    
    # 移除数据库文件
    if check_directory "$DB_PATH"; then
        log_info "(跳过)移除数据库文件..."
        # rm -f "$DB_PATH/WMBlog.db" || log_warn "无法删除数据库文件"
    else
        log_warn "数据库目录不存在，跳过删除数据库文件"
    fi
}

# 复制发布文件
copy_publish_files() {
    # 定义当前目录的目标发布目录名（与源发布目录名一致）
    DEST_DIR="./$(basename "$PUBLISH_PATH")"  # 如：./.PublishFiles

    log_info "复制发布文件到当前目录..."
    
    # 先删除当前目录的旧发布目录（如果存在）
    if [ -d "$DEST_DIR" ]; then
        log_info "删除当前目录的旧发布目录: $DEST_DIR"
        rm -rf "$DEST_DIR" || handle_error "删除旧发布目录失败，请检查权限"
    fi

    # 再复制新的发布文件
    cp -rf "$PUBLISH_PATH" ./ || handle_error "复制文件失败"
}

# 主函数
main() {
    log_info "开始项目发布流程..."
    log_info "脚本路径: $SCRIPT_PATH"
    log_info "项目路径: $PROJECT_PATH"
    
    clean_publish
    build_project
    publish_project
    clean_after_publish
    copy_publish_files
    
    log_info "====================================="
    log_info "发布成功！请查看.PublishFiles目录"
    log_info "====================================="
}

# 执行主函数
main